#ifndef ROOMLIST_H
#define ROOMLIST_H

#include <string>
using namespace std;
#include <map>
#include <functional>
#include <mutex>

using callback = function<void(string)>;
using UserMap = map<string, callback>; // <用户名, 给用户发送数据的可调用类型>

/* 游戏房间列表: 采用懒汉策略的单例模式
 *      [1] 懒汉策略: 在需要该对象时, 才将该对象实例化
 *      [2] [采用懒汉策略的单例模式]有线程安全问题 -> 解决线程安全问题的最简单方法: 使用静态局部对象
*/
class RoomList {
public:
    RoomList(const RoomList&) = delete;
    RoomList& operator=(const RoomList&) = delete;

    static RoomList* getInstance(); // 获取单例对象

    // 添加用户到_roomsMap中的roomName房间
    void addUser(string roomName, string userName, callback sendMessage);

    // 通过房间名取出房间内的成员信息
    UserMap getPlayers(string roomName);

    // 得到当前房间中除指定玩家外的其他玩家
    UserMap getPartners(string roomName, string userName);

    // 删除指定房间中的玩家
    void removePlayer(string roomName, string userName);

    // 清空指定房间中的所有玩家
    void removeRoom(string roomName);
private:
    RoomList() = default;
    map<string, UserMap> _roomsMap; // 共享资源(被服务器的多个工作线程访问): <房间名, <用户名, 给用户发送数据的可调用类型>>
    mutex _mutex;
};

#endif //ROOMLIST_H
